{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# for use in tutorial and development; do not include this `sys.path` change in production:\n",
    "import sys ; sys.path.insert(0, \"../\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Explain PyTextRank: the algorithm\n",
    "\n",
    "Let's look at the *TextRank* algorithm used to build a graph from a raw text, and then from that extract the top-ranked phrases. This work is based on \n",
    "[\"TextRank: Bringing Order into Text\"](http://web.eecs.umich.edu/~mihalcea/papers/mihalcea.emnlp04.pdf),\n",
    "Rada Mihalcea, Paul Tarau, _Empirical Methods in Natural Language Processing_ (2004)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "First we perform some basic housekeeping for Jupyter, then load `spaCy` with a language model for English ..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import spacy\n",
    "nlp = spacy.load(\"en_core_web_sm\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, to get started, we'll create some text to use."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#text = \"When Ada was twelve years old, this future 'Lady Fairy', as Charles Babbage affectionately called her, decided she wanted to fly. Ada Byron went about the project methodically, thoughtfully, with imagination and passion. Her first step, in February 1828, was to construct wings. She investigated different material and sizes. She considered various materials for the wings: paper, oilsilk, wires, and feathers. She examined the anatomy of birds to determine the right proportion between the wings and the body. She decided to write a book, Flyology, illustrating, with plates, some of her findings. She decided what equipment she would need; for example, a compass, to 'cut across the country by the most direct road', so that she could surmount mountains, rivers, and valleys. Her final step was to integrate steam with the 'art of flying.\"\n",
    "\n",
    "text = \"Compatibility of systems of linear constraints over the set of natural numbers. Criteria of compatibility of a system of linear Diophantine equations, strict inequations, and nonstrict inequations are considered. Upper bounds for components of a minimal set of solutions and algorithms of construction of minimal generating sets of solutions for all types of systems are given. These criteria and the corresponding algorithms for constructing a minimal supporting set of solutions can be used in solving all the considered types systems and systems of mixed types.\"\n",
    "\n",
    "doc = nlp(text)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "How many sentences are in the parsed document and where are their boundaries?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| sent.start: 0, sent.end: 13\n",
      "ic| sent.start: 13, sent.end: 33\n",
      "ic| sent.start: 33, sent.end: 61\n",
      "ic| sent.start: 61, sent.end: 91\n"
     ]
    }
   ],
   "source": [
    "from icecream import ic\n",
    "\n",
    "for sent in doc.sents:\n",
    "    ic(sent.start, sent.end)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What are the raw _noun chunks_ in the parsed document?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| chunk.text: 'Compatibility'\n",
      "ic| chunk.text: 'systems'\n",
      "ic| chunk.text: 'linear constraints'\n",
      "ic| chunk.text: 'the set'\n",
      "ic| chunk.text: 'natural numbers'\n",
      "ic| chunk.text: 'Criteria'\n",
      "ic| chunk.text: 'compatibility'\n",
      "ic| chunk.text: 'a system'\n",
      "ic| chunk.text: 'linear Diophantine equations'\n",
      "ic| chunk.text: 'strict inequations'\n",
      "ic| chunk.text: 'nonstrict inequations'\n",
      "ic| chunk.text: 'Upper bounds'\n",
      "ic| chunk.text: 'components'\n",
      "ic| chunk.text: 'a minimal set'\n",
      "ic| chunk.text: 'solutions'\n",
      "ic| chunk.text: 'algorithms'\n",
      "ic| chunk.text: 'construction'\n",
      "ic| chunk.text: 'minimal generating sets'\n",
      "ic| chunk.text: 'solutions'\n",
      "ic| chunk.text: 'all types'\n",
      "ic| chunk.text: 'systems'\n",
      "ic| chunk.text: 'These criteria'\n",
      "ic| chunk.text: 'the corresponding algorithms'\n",
      "ic| chunk.text: 'a minimal supporting set'\n",
      "ic| chunk.text: 'solutions'\n",
      "ic| chunk.text: 'all the considered types systems'\n",
      "ic| chunk.text: 'systems'\n",
      "ic| chunk.text: 'mixed types'\n"
     ]
    }
   ],
   "source": [
    "for chunk in doc.noun_chunks:\n",
    "    ic(chunk.text)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Also, does `spaCy` detect any _named entities_?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| ent.text: 'Diophantine'\n",
      "    ent.label_: 'GPE'\n",
      "    ent.start: 21\n",
      "    ent.end: 22\n"
     ]
    }
   ],
   "source": [
    "for ent in doc.ents:\n",
    "    ic(ent.text, ent.label_, ent.start, ent.end)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Given those details about the parsed document, next we use [NetworkX](https://networkx.github.io/) to manage an in-memory graph..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import networkx as nx\n",
    "\n",
    "def increment_edge (graph, node0, node1):\n",
    "    ic(node0, node1)\n",
    "    \n",
    "    if graph.has_edge(node0, node1):\n",
    "        graph[node0][node1][\"weight\"] += 1.0\n",
    "    else:\n",
    "        graph.add_edge(node0, node1, weight=1.0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then construct a graph, sentence by sentence, based on the [spaCy part-of-speech tags](https://spacy.io/api/annotation#pos-en) tags:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "POS_KEPT = [\"ADJ\", \"NOUN\", \"PROPN\", \"VERB\"]\n",
    "\n",
    "def link_sentence (doc, sent, lemma_graph, seen_lemma):\n",
    "    visited_tokens = []\n",
    "    visited_nodes = []\n",
    "\n",
    "    for i in range(sent.start, sent.end):\n",
    "        token = doc[i]\n",
    "\n",
    "        if token.pos_ in POS_KEPT:\n",
    "            key = (token.lemma_, token.pos_)\n",
    "\n",
    "            if key not in seen_lemma:\n",
    "                seen_lemma[key] = set([token.i])\n",
    "            else:\n",
    "                seen_lemma[key].add(token.i)\n",
    "\n",
    "            node_id = list(seen_lemma.keys()).index(key)\n",
    "\n",
    "            if not node_id in lemma_graph:\n",
    "                lemma_graph.add_node(node_id)\n",
    "\n",
    "            ic(visited_tokens, visited_nodes)\n",
    "            ic(list(range(len(visited_tokens) - 1, -1, -1)))\n",
    "            \n",
    "            for prev_token in range(len(visited_tokens) - 1, -1, -1):\n",
    "                ic(prev_token, (token.i - visited_tokens[prev_token]))\n",
    "                \n",
    "                if (token.i - visited_tokens[prev_token]) <= 3:\n",
    "                    increment_edge(lemma_graph, node_id, visited_nodes[prev_token])\n",
    "                else:\n",
    "                    break\n",
    "\n",
    "            ic(token.i, token.text, token.lemma_, token.pos_, visited_tokens, visited_nodes)\n",
    "\n",
    "            visited_tokens.append(token.i)\n",
    "            visited_nodes.append(node_id)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now iterate through the sentences to construct the lemma graph..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| visited_tokens: [], visited_nodes: []\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): []\n",
      "ic| token.i: 0\n",
      "    token.text: 'Compatibility'\n",
      "    token.lemma_: 'compatibility'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: []\n",
      "    visited_nodes: []\n",
      "ic| visited_tokens: [0], visited_nodes: [0]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [0]\n",
      "ic| prev_token: 0, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 1, node1: 0\n",
      "ic| token.i: 2\n",
      "    token.text: 'systems'\n",
      "    token.lemma_: 'system'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [0]\n",
      "    visited_nodes: [0]\n",
      "ic| visited_tokens: [0, 2], visited_nodes: [0, 1]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [1, 0]\n",
      "ic| prev_token: 1, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 2, node1: 1\n",
      "ic| prev_token: 0, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 4\n",
      "    token.text: 'linear'\n",
      "    token.lemma_: 'linear'\n",
      "    token.pos_: 'ADJ'\n",
      "    visited_tokens: [0, 2]\n",
      "    visited_nodes: [0, 1]\n",
      "ic| visited_tokens: [0, 2, 4], visited_nodes: [0, 1, 2]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [2, 1, 0]\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 3, node1: 2\n",
      "ic| prev_token: 1, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 3, node1: 1\n",
      "ic| prev_token: 0, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 5\n",
      "    token.text: 'constraints'\n",
      "    token.lemma_: 'constraint'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [0, 2, 4]\n",
      "    visited_nodes: [0, 1, 2]\n",
      "ic| visited_tokens: [0, 2, 4, 5], visited_nodes: [0, 1, 2, 3]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [3, 2, 1, 0]\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 4, node1: 3\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 8\n",
      "    token.text: 'set'\n",
      "    token.lemma_: 'set'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [0, 2, 4, 5]\n",
      "    visited_nodes: [0, 1, 2, 3]\n",
      "ic| visited_tokens: [0, 2, 4, 5, 8], visited_nodes: [0, 1, 2, 3, 4]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [4, 3, 2, 1, 0]\n",
      "ic| prev_token: 4, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 5, node1: 4\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 10\n",
      "    token.text: 'natural'\n",
      "    token.lemma_: 'natural'\n",
      "    token.pos_: 'ADJ'\n",
      "    visited_tokens: [0, 2, 4, 5, 8]\n",
      "    visited_nodes: [0, 1, 2, 3, 4]\n",
      "ic| visited_tokens: [0, 2, 4, 5, 8, 10]\n",
      "    visited_nodes: [0, 1, 2, 3, 4, 5]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 5, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 6, node1: 5\n",
      "ic| prev_token: 4, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 6, node1: 4\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 6\n",
      "ic| token.i: 11\n",
      "    token.text: 'numbers'\n",
      "    token.lemma_: 'number'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [0, 2, 4, 5, 8, 10]\n",
      "    visited_nodes: [0, 1, 2, 3, 4, 5]\n",
      "ic| visited_tokens: [], visited_nodes: []\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): []\n",
      "ic| token.i: 13\n",
      "    token.text: 'Criteria'\n",
      "    token.lemma_: 'criterion'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: []\n",
      "    visited_nodes: []\n",
      "ic| visited_tokens: [13], visited_nodes: [7]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [0]\n",
      "ic| prev_token: 0, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 0, node1: 7\n",
      "ic| token.i: 15\n",
      "    token.text: 'compatibility'\n",
      "    token.lemma_: 'compatibility'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [13]\n",
      "    visited_nodes: [7]\n",
      "ic| visited_tokens: [13, 15], visited_nodes: [7, 0]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [1, 0]\n",
      "ic| prev_token: 1, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 1, node1: 0\n",
      "ic| prev_token: 0, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 18\n",
      "    token.text: 'system'\n",
      "    token.lemma_: 'system'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [13, 15]\n",
      "    visited_nodes: [7, 0]\n",
      "ic| visited_tokens: [13, 15, 18], visited_nodes: [7, 0, 1]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [2, 1, 0]\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 2, node1: 1\n",
      "ic| prev_token: 1, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 20\n",
      "    token.text: 'linear'\n",
      "    token.lemma_: 'linear'\n",
      "    token.pos_: 'ADJ'\n",
      "    visited_tokens: [13, 15, 18]\n",
      "    visited_nodes: [7, 0, 1]\n",
      "ic| visited_tokens: [13, 15, 18, 20], visited_nodes: [7, 0, 1, 2]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [3, 2, 1, 0]\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 8, node1: 2\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 8, node1: 1\n",
      "ic| prev_token: 1, token.i - visited_tokens[prev_token]: 6\n",
      "ic| token.i: 21\n",
      "    token.text: 'Diophantine'\n",
      "    token.lemma_: 'Diophantine'\n",
      "    token.pos_: 'PROPN'\n",
      "    visited_tokens: [13, 15, 18, 20]\n",
      "    visited_nodes: [7, 0, 1, 2]\n",
      "ic| visited_tokens: [13, 15, 18, 20, 21]\n",
      "    visited_nodes: [7, 0, 1, 2, 8]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [4, 3, 2, 1, 0]\n",
      "ic| prev_token: 4, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 9, node1: 8\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 9, node1: 2\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 22\n",
      "    token.text: 'equations'\n",
      "    token.lemma_: 'equation'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [13, 15, 18, 20, 21]\n",
      "    visited_nodes: [7, 0, 1, 2, 8]\n",
      "ic| visited_tokens: [13, 15, 18, 20, 21, 22]\n",
      "    visited_nodes: [7, 0, 1, 2, 8, 9]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 5, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 10, node1: 9\n",
      "ic| prev_token: 4, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 10, node1: 8\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 24\n",
      "    token.text: 'strict'\n",
      "    token.lemma_: 'strict'\n",
      "    token.pos_: 'ADJ'\n",
      "    visited_tokens: [13, 15, 18, 20, 21, 22]\n",
      "    visited_nodes: [7, 0, 1, 2, 8, 9]\n",
      "ic| visited_tokens: [13, 15, 18, 20, 21, 22, 24]\n",
      "    visited_nodes: [7, 0, 1, 2, 8, 9, 10]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 6, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 11, node1: 10\n",
      "ic| prev_token: 5, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 11, node1: 9\n",
      "ic| prev_token: 4, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 25\n",
      "    token.text: 'inequations'\n",
      "    token.lemma_: 'inequation'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [13, 15, 18, 20, 21, 22, 24]\n",
      "    visited_nodes: [7, 0, 1, 2, 8, 9, 10]\n",
      "ic| visited_tokens: [13, 15, 18, 20, 21, 22, 24, 25]\n",
      "    visited_nodes: [7, 0, 1, 2, 8, 9, 10, 11]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 7, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 12, node1: 11\n",
      "ic| prev_token: 6, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 28\n",
      "    token.text: 'nonstrict'\n",
      "    token.lemma_: 'nonstrict'\n",
      "    token.pos_: 'ADJ'\n",
      "    visited_tokens: [13, 15, 18, 20, 21, 22, 24, 25]\n",
      "    visited_nodes: [7, 0, 1, 2, 8, 9, 10, 11]\n",
      "ic| visited_tokens: [13, 15, 18, 20, 21, 22, 24, 25, 28]\n",
      "    visited_nodes: [7, 0, 1, 2, 8, 9, 10, 11, 12]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 8, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 11, node1: 12\n",
      "ic| prev_token: 7, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 29\n",
      "    token.text: 'inequations'\n",
      "    token.lemma_: 'inequation'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [13, 15, 18, 20, 21, 22, 24, 25, 28]\n",
      "    visited_nodes: [7, 0, 1, 2, 8, 9, 10, 11, 12]\n",
      "ic| visited_tokens: [13, 15, 18, 20, 21, 22, 24, 25, 28, 29]\n",
      "    visited_nodes: [7, 0, 1, 2, 8, 9, 10, 11, 12, 11]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 9, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 13, node1: 11\n",
      "ic| prev_token: 8, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 13, node1: 12\n",
      "ic| prev_token: 7, token.i - visited_tokens[prev_token]: 6\n",
      "ic| token.i: 31\n",
      "    token.text: 'considered'\n",
      "    token.lemma_: 'consider'\n",
      "    token.pos_: 'VERB'\n",
      "    visited_tokens: [13, 15, 18, 20, 21, 22, 24, 25, 28, 29]\n",
      "    visited_nodes: [7, 0, 1, 2, 8, 9, 10, 11, 12, 11]\n",
      "ic| visited_tokens: [], visited_nodes: []\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): []\n",
      "ic| token.i: 33\n",
      "    token.text: 'Upper'\n",
      "    token.lemma_: 'Upper'\n",
      "    token.pos_: 'PROPN'\n",
      "    visited_tokens: []\n",
      "    visited_nodes: []\n",
      "ic| visited_tokens: [33], visited_nodes: [14]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [0]\n",
      "ic| prev_token: 0, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 15, node1: 14\n",
      "ic| token.i: 34\n",
      "    token.text: 'bounds'\n",
      "    token.lemma_: 'bound'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33]\n",
      "    visited_nodes: [14]\n",
      "ic| visited_tokens: [33, 34], visited_nodes: [14, 15]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [1, 0]\n",
      "ic| prev_token: 1, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 16, node1: 15\n",
      "ic| prev_token: 0, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 16, node1: 14\n",
      "ic| token.i: 36\n",
      "    token.text: 'components'\n",
      "    token.lemma_: 'component'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33, 34]\n",
      "    visited_nodes: [14, 15]\n",
      "ic| visited_tokens: [33, 34, 36], visited_nodes: [14, 15, 16]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [2, 1, 0]\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 17, node1: 16\n",
      "ic| prev_token: 1, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 39\n",
      "    token.text: 'minimal'\n",
      "    token.lemma_: 'minimal'\n",
      "    token.pos_: 'ADJ'\n",
      "    visited_tokens: [33, 34, 36]\n",
      "    visited_nodes: [14, 15, 16]\n",
      "ic| visited_tokens: [33, 34, 36, 39], visited_nodes: [14, 15, 16, 17]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [3, 2, 1, 0]\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 4, node1: 17\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 40\n",
      "    token.text: 'set'\n",
      "    token.lemma_: 'set'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33, 34, 36, 39]\n",
      "    visited_nodes: [14, 15, 16, 17]\n",
      "ic| visited_tokens: [33, 34, 36, 39, 40]\n",
      "    visited_nodes: [14, 15, 16, 17, 4]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [4, 3, 2, 1, 0]\n",
      "ic| prev_token: 4, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 18, node1: 4\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 18, node1: 17\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 6\n",
      "ic| token.i: 42\n",
      "    token.text: 'solutions'\n",
      "    token.lemma_: 'solution'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33, 34, 36, 39, 40]\n",
      "    visited_nodes: [14, 15, 16, 17, 4]\n",
      "ic| visited_tokens: [33, 34, 36, 39, 40, 42]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 5, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 19, node1: 18\n",
      "ic| prev_token: 4, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 44\n",
      "    token.text: 'algorithms'\n",
      "    token.lemma_: 'algorithm'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33, 34, 36, 39, 40, 42]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18]\n",
      "ic| visited_tokens: [33, 34, 36, 39, 40, 42, 44]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 6, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 20, node1: 19\n",
      "ic| prev_token: 5, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 46\n",
      "    token.text: 'construction'\n",
      "    token.lemma_: 'construction'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33, 34, 36, 39, 40, 42, 44]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19]\n",
      "ic| visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 7, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 17, node1: 20\n",
      "ic| prev_token: 6, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 48\n",
      "    token.text: 'minimal'\n",
      "    token.lemma_: 'minimal'\n",
      "    token.pos_: 'ADJ'\n",
      "    visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20]\n",
      "ic| visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 8, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 21, node1: 17\n",
      "ic| prev_token: 7, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 21, node1: 20\n",
      "ic| prev_token: 6, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 49\n",
      "    token.text: 'generating'\n",
      "    token.lemma_: 'generating'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17]\n",
      "ic| visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48, 49]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17, 21]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 9, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 4, node1: 21\n",
      "ic| prev_token: 8, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 4, node1: 17\n",
      "ic| prev_token: 7, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 50\n",
      "    token.text: 'sets'\n",
      "    token.lemma_: 'set'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48, 49]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17, 21]\n",
      "ic| visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48, 49, 50]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17, 21, 4]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 10, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 18, node1: 4\n",
      "ic| prev_token: 9, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 18, node1: 21\n",
      "ic| prev_token: 8, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 52\n",
      "    token.text: 'solutions'\n",
      "    token.lemma_: 'solution'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48, 49, 50]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17, 21, 4]\n",
      "ic| visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48, 49, 50, 52]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17, 21, 4, 18]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 11, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 22, node1: 18\n",
      "ic| prev_token: 10, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 55\n",
      "    token.text: 'types'\n",
      "    token.lemma_: 'type'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48, 49, 50, 52]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17, 21, 4, 18]\n",
      "ic| visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48, 49, 50, 52, 55]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17, 21, 4, 18, 22]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 12, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 1, node1: 22\n",
      "ic| prev_token: 11, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 57\n",
      "    token.text: 'systems'\n",
      "    token.lemma_: 'system'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48, 49, 50, 52, 55]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17, 21, 4, 18, 22]\n",
      "ic| visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48, 49, 50, 52, 55, 57]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17, 21, 4, 18, 22, 1]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 13, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 23, node1: 1\n",
      "ic| prev_token: 12, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 59\n",
      "    token.text: 'given'\n",
      "    token.lemma_: 'give'\n",
      "    token.pos_: 'VERB'\n",
      "    visited_tokens: [33, 34, 36, 39, 40, 42, 44, 46, 48, 49, 50, 52, 55, 57]\n",
      "    visited_nodes: [14, 15, 16, 17, 4, 18, 19, 20, 17, 21, 4, 18, 22, 1]\n",
      "ic| visited_tokens: [], visited_nodes: []\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): []\n",
      "ic| token.i: 62\n",
      "    token.text: 'criteria'\n",
      "    token.lemma_: 'criterion'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: []\n",
      "    visited_nodes: []\n",
      "ic| visited_tokens: [62], visited_nodes: [7]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [0]\n",
      "ic| prev_token: 0, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 24, node1: 7\n",
      "ic| token.i: 65\n",
      "    token.text: 'corresponding'\n",
      "    token.lemma_: 'correspond'\n",
      "    token.pos_: 'VERB'\n",
      "    visited_tokens: [62]\n",
      "    visited_nodes: [7]\n",
      "ic| visited_tokens: [62, 65], visited_nodes: [7, 24]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [1, 0]\n",
      "ic| prev_token: 1, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 19, node1: 24\n",
      "ic| prev_token: 0, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 66\n",
      "    token.text: 'algorithms'\n",
      "    token.lemma_: 'algorithm'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [62, 65]\n",
      "    visited_nodes: [7, 24]\n",
      "ic| visited_tokens: [62, 65, 66], visited_nodes: [7, 24, 19]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [2, 1, 0]\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 25, node1: 19\n",
      "ic| prev_token: 1, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 25, node1: 24\n",
      "ic| prev_token: 0, token.i - visited_tokens[prev_token]: 6\n",
      "ic| token.i: 68\n",
      "    token.text: 'constructing'\n",
      "    token.lemma_: 'construct'\n",
      "    token.pos_: 'VERB'\n",
      "    visited_tokens: [62, 65, 66]\n",
      "    visited_nodes: [7, 24, 19]\n",
      "ic| visited_tokens: [62, 65, 66, 68], visited_nodes: [7, 24, 19, 25]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [3, 2, 1, 0]\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 17, node1: 25\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 70\n",
      "    token.text: 'minimal'\n",
      "    token.lemma_: 'minimal'\n",
      "    token.pos_: 'ADJ'\n",
      "    visited_tokens: [62, 65, 66, 68]\n",
      "    visited_nodes: [7, 24, 19, 25]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70]\n",
      "    visited_nodes: [7, 24, 19, 25, 17]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [4, 3, 2, 1, 0]\n",
      "ic| prev_token: 4, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 26, node1: 17\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 26, node1: 25\n",
      "ic| prev_token: 2, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 71\n",
      "    token.text: 'supporting'\n",
      "    token.lemma_: 'support'\n",
      "    token.pos_: 'VERB'\n",
      "    visited_tokens: [62, 65, 66, 68, 70]\n",
      "    visited_nodes: [7, 24, 19, 25, 17]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70, 71]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 5, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 4, node1: 26\n",
      "ic| prev_token: 4, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 4, node1: 17\n",
      "ic| prev_token: 3, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 72\n",
      "    token.text: 'set'\n",
      "    token.lemma_: 'set'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [62, 65, 66, 68, 70, 71]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70, 71, 72]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 6, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 18, node1: 4\n",
      "ic| prev_token: 5, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 18, node1: 26\n",
      "ic| prev_token: 4, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 74\n",
      "    token.text: 'solutions'\n",
      "    token.lemma_: 'solution'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [62, 65, 66, 68, 70, 71, 72]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 7, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 27, node1: 18\n",
      "ic| prev_token: 6, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 77\n",
      "    token.text: 'used'\n",
      "    token.lemma_: 'use'\n",
      "    token.pos_: 'VERB'\n",
      "    visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 8, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 28, node1: 27\n",
      "ic| prev_token: 7, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 79\n",
      "    token.text: 'solving'\n",
      "    token.lemma_: 'solve'\n",
      "    token.pos_: 'VERB'\n",
      "    visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 9, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 13, node1: 28\n",
      "ic| prev_token: 8, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 82\n",
      "    token.text: 'considered'\n",
      "    token.lemma_: 'consider'\n",
      "    token.pos_: 'VERB'\n",
      "    visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79, 82]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28, 13]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 10, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 22, node1: 13\n",
      "ic| prev_token: 9, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 83\n",
      "    token.text: 'types'\n",
      "    token.lemma_: 'type'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79, 82]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28, 13]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79, 82, 83]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28, 13, 22]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 11, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 1, node1: 22\n",
      "ic| prev_token: 10, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 1, node1: 13\n",
      "ic| prev_token: 9, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 84\n",
      "    token.text: 'systems'\n",
      "    token.lemma_: 'system'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79, 82, 83]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28, 13, 22]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79, 82, 83, 84]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28, 13, 22, 1]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 12, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 1, node1: 1\n",
      "ic| prev_token: 11, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 1, node1: 22\n",
      "ic| prev_token: 10, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 86\n",
      "    token.text: 'systems'\n",
      "    token.lemma_: 'system'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79, 82, 83, 84]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28, 13, 22, 1]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79, 82, 83, 84, 86]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28, 13, 22, 1, 1]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 13, token.i - visited_tokens[prev_token]: 2\n",
      "ic| node0: 29, node1: 1\n",
      "ic| prev_token: 12, token.i - visited_tokens[prev_token]: 4\n",
      "ic| token.i: 88\n",
      "    token.text: 'mixed'\n",
      "    token.lemma_: 'mixed'\n",
      "    token.pos_: 'ADJ'\n",
      "    visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79, 82, 83, 84, 86]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28, 13, 22, 1, 1]\n",
      "ic| visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79, 82, 83, 84, 86, 88]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28, 13, 22, 1, 1, 29]\n",
      "ic| list(range(len(visited_tokens) - 1, -1, -1)): [14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]\n",
      "ic| prev_token: 14, token.i - visited_tokens[prev_token]: 1\n",
      "ic| node0: 22, node1: 29\n",
      "ic| prev_token: 13, token.i - visited_tokens[prev_token]: 3\n",
      "ic| node0: 22, node1: 1\n",
      "ic| prev_token: 12, token.i - visited_tokens[prev_token]: 5\n",
      "ic| token.i: 89\n",
      "    token.text: 'types'\n",
      "    token.lemma_: 'type'\n",
      "    token.pos_: 'NOUN'\n",
      "    visited_tokens: [62, 65, 66, 68, 70, 71, 72, 74, 77, 79, 82, 83, 84, 86, 88]\n",
      "    visited_nodes: [7, 24, 19, 25, 17, 26, 4, 18, 27, 28, 13, 22, 1, 1, 29]\n"
     ]
    }
   ],
   "source": [
    "lemma_graph = nx.Graph()\n",
    "seen_lemma = {}\n",
    "\n",
    "for sent in doc.sents:\n",
    "    link_sentence(doc, sent, lemma_graph, seen_lemma)\n",
    "    #break # only test one sentence"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| seen_lemma: {('Diophantine', 'PROPN'): {21},\n",
      "                 ('Upper', 'PROPN'): {33},\n",
      "                 ('algorithm', 'NOUN'): {66, 44},\n",
      "                 ('bound', 'NOUN'): {34},\n",
      "                 ('compatibility', 'NOUN'): {0, 15},\n",
      "                 ('component', 'NOUN'): {36},\n",
      "                 ('consider', 'VERB'): {82, 31},\n",
      "                 ('constraint', 'NOUN'): {5},\n",
      "                 ('construct', 'VERB'): {68},\n",
      "                 ('construction', 'NOUN'): {46},\n",
      "                 ('correspond', 'VERB'): {65},\n",
      "                 ('criterion', 'NOUN'): {13, 62},\n",
      "                 ('equation', 'NOUN'): {22},\n",
      "                 ('generating', 'NOUN'): {49},\n",
      "                 ('give', 'VERB'): {59},\n",
      "                 ('inequation', 'NOUN'): {25, 29},\n",
      "                 ('linear', 'ADJ'): {4, 20},\n",
      "                 ('minimal', 'ADJ'): {48, 70, 39},\n",
      "                 ('mixed', 'ADJ'): {88},\n",
      "                 ('natural', 'ADJ'): {10},\n",
      "                 ('nonstrict', 'ADJ'): {28},\n",
      "                 ('number', 'NOUN'): {11},\n",
      "                 ('set', 'NOUN'): {8, 40, 72, 50},\n",
      "                 ('solution', 'NOUN'): {42, 52, 74},\n",
      "                 ('solve', 'VERB'): {79},\n",
      "                 ('strict', 'ADJ'): {24},\n",
      "                 ('support', 'VERB'): {71},\n",
      "                 ('system', 'NOUN'): {2, 18, 84, 86, 57},\n",
      "                 ('type', 'NOUN'): {89, 83, 55},\n",
      "                 ('use', 'VERB'): {77}}\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{('compatibility', 'NOUN'): {0, 15},\n",
       " ('system', 'NOUN'): {2, 18, 57, 84, 86},\n",
       " ('linear', 'ADJ'): {4, 20},\n",
       " ('constraint', 'NOUN'): {5},\n",
       " ('set', 'NOUN'): {8, 40, 50, 72},\n",
       " ('natural', 'ADJ'): {10},\n",
       " ('number', 'NOUN'): {11},\n",
       " ('criterion', 'NOUN'): {13, 62},\n",
       " ('Diophantine', 'PROPN'): {21},\n",
       " ('equation', 'NOUN'): {22},\n",
       " ('strict', 'ADJ'): {24},\n",
       " ('inequation', 'NOUN'): {25, 29},\n",
       " ('nonstrict', 'ADJ'): {28},\n",
       " ('consider', 'VERB'): {31, 82},\n",
       " ('Upper', 'PROPN'): {33},\n",
       " ('bound', 'NOUN'): {34},\n",
       " ('component', 'NOUN'): {36},\n",
       " ('minimal', 'ADJ'): {39, 48, 70},\n",
       " ('solution', 'NOUN'): {42, 52, 74},\n",
       " ('algorithm', 'NOUN'): {44, 66},\n",
       " ('construction', 'NOUN'): {46},\n",
       " ('generating', 'NOUN'): {49},\n",
       " ('type', 'NOUN'): {55, 83, 89},\n",
       " ('give', 'VERB'): {59},\n",
       " ('correspond', 'VERB'): {65},\n",
       " ('construct', 'VERB'): {68},\n",
       " ('support', 'VERB'): {71},\n",
       " ('use', 'VERB'): {77},\n",
       " ('solve', 'VERB'): {79},\n",
       " ('mixed', 'ADJ'): {88}}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ic(seen_lemma)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's visualize the lemma graph, and for that first we need to collect a dictionary of the labels."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: 'compatibility',\n",
       " 1: 'system',\n",
       " 2: 'linear',\n",
       " 3: 'constraint',\n",
       " 4: 'set',\n",
       " 5: 'natural',\n",
       " 6: 'number',\n",
       " 7: 'criterion',\n",
       " 8: 'diophantine',\n",
       " 9: 'equation',\n",
       " 10: 'strict',\n",
       " 11: 'inequation',\n",
       " 12: 'nonstrict',\n",
       " 13: 'consider',\n",
       " 14: 'upper',\n",
       " 15: 'bound',\n",
       " 16: 'component',\n",
       " 17: 'minimal',\n",
       " 18: 'solution',\n",
       " 19: 'algorithm',\n",
       " 20: 'construction',\n",
       " 21: 'generating',\n",
       " 22: 'type',\n",
       " 23: 'give',\n",
       " 24: 'correspond',\n",
       " 25: 'construct',\n",
       " 26: 'support',\n",
       " 27: 'use',\n",
       " 28: 'solve',\n",
       " 29: 'mixed'}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "labels = {}\n",
    "keys = list(seen_lemma.keys())\n",
    "\n",
    "for i in range(len(seen_lemma)):\n",
    "    labels[i] = keys[i][0].lower()\n",
    "\n",
    "labels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then use `matplotlib` to visualize the lemma graph:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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9JPBd7EfO3aMX375hYsXL2bourNnz2b7Iu85Sc75CRVCCCGyWHYYsZw+fTrNmzenRo0aRo0jMz766CN27dpF3759Wbt2rcHuExsby2effcbSpUtxcXHJ0HV3796lXLlyBostr5ERSyGEECIVxk4sr1+/zk8//cSVK1eMFsO7+uCDDzh48CDNmzcnNDSUkSNH6v0e48aNo1atWnzyyScZuk427uifJJZCCCFEKmJjY7GzszPKvXU6HSNGjGDChAkUKFDAKDHoS5kyZZKOgHzy5AmzZs3SWx3OAwcOsH379gxPgYNs3DEEmQoXQgghUmHMAum///479+7dY8iQIUa5v765u7tz9OhRDh48SN++fVGr1e/cZ1RUFL1792blypU4OTll+HpJLPVPEkshhBAiFcYqkJ6QkMAXX3zBd999l6umaV8eAfngwQM6der0zkdAjho1ig8//JDmzZtn6vozZ85QrVq1d4pBJCeJpRBCCJEKY62xXLBgAeXKlct0wpSd2drasnPnTiwsLGjevDmRkZGZ6mfPnj3s37+f+fPnZ+r62NhY7t27Jxt39EzWWAohhBCpMEZiGRwczLx58zh58mSW3jcrmZub88svvzBs2DAaNmzI3r1731hHGhqTwJazD7j+KIqoeDX2lqZ4FbSnU1U3TFTP6devH2vWrMl0wXjZuGMYklgKIYQQqTDGGsuxY8fSv39/SpQokaX3zWomJiYsWrSI6dOnU6dOHfbt20fx4sW5EBTBkkO3OXzzKQAJam3SNZamj1jw501sowNp2N6bxo0bZ/r+sr7SMCSxFEIIIVKR1Wss//77bw4fPsy1a9ey7J7GpFAomDJlCq6urtSrV49hCzfhdyGaeLUGne7N9vH/TzITLApz2rwo607cp0dNz0zd++zZs9SrV+8dohcpkTWWQgghRCqycipco9EwdOhQvvnmG6Of9pPVBg4cSOcJi1h6/DFxqpSTymRMTIhXa/HdfY11J+4DL9Zu3r17N933PHPmjIxYGoCMWAohhBCpyMrE8scff8TGxoauXbtmyf2ykwtBEex9bI3CTJOu9o9+HodN+UZQqRm+u69T0c2RmJiYdN9PNu4YjoxYCiGEEKnIqjWW4eHhTJkyhUWLFumtcHhOsuTQbeLV6UsqXxev1rD00O0MXSMbdwxHEkshhBAiFVk1Yjl16lQ++eQTKleu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dfbcFBi5GZWRMQAPvUbz7Yz5XA0Iy4Aoxafk/PnzVK1alVWrVnHw4EF++eUXbG1tDR2WyCIksRTCwGJjY+nduzfLly/nzJkz1K5dO93b7NChA/b29ixatCjJZd48gadQoUJs3ryZFStWMGvWLGrVqsWFCxfSK9w0N2XKFObNm8eLFy8MHQoLj90jRqP94D2K7t3X47U6Fh2THkqRICQkhH79+tGyZUuGDBnCiRMnKFu2rKHDElmMJJZCGNDTp0+pV68e4eHhnDp1ChcXlwxpV6VS8dtvvzFt2jSePn2apDLvOtqxTp06XLhwgZ49e9KiRQt69uz5Scy/LFasGK1bt+ann35KUfkffviBwoULY21tTalSpdi2bds77ztw4ADFixcne/bsDBw4kDp16vDHH38AoNPp+H7iZJYPdsXvly4E75yLLiYKAE3YMx794EbElQMELOrJs7Vj9e8pOi0vjq8kNuAmIQcWs6RXLfr0G6Bv89ChQxQtWhRbW1sGDRqk70328vKiRo0aDB8+HFtbWwoVKsTp06fx8vLCycmJ3Llzs2LFihR9HsKwdDodS5YsoVSpUpiamnLr1i26desmw97CICSxFMJALl68SOXKlWncuDGbNm3CysoqQ9svUaIEvXr1SvJCnjJlyuDr60tYWFii942Njenduzd37twhT548fPnll5/E/MsJEyawePFinj17luyyhQsX5sSJE4SHhzNp0iQ8PT158uRJonuCg4Np3749s2bNIiQkhOLFiydKzL28vFi2bDmOXX8gf/8/0MXHEHpwcaI6Yv2u4dDnf+TuNDXR+znqdMPUsRQ5G/en2HdbqdRllP7arl27OH/+PFevXmXjxo3s379ff+3s2bOUKVOGkJAQOnfujLu7O+fPn+fevXusXr2awYMHp8vcU5F+Xg97r1ixgv3797NgwQIZ9hYGJYmlEAawYcMGmjRpws8//8zkyZMNdszghAkTOHr0KH///fdH7zUxMaFixYrvPdrRxsaGH374gfPnz3Px4sVMP/+yQIECdO3alZkzZya7bIcOHXBwcMDIyIhOnTpRtGhRzp07l+iePXv2ULp0adq2bYtarWbo0KHkzZtXf33NmjWUbtoZxToPRtnMyVGnO1G3/k407J29VheMsplhZPL+rZFiNDpuP/n3pJ4xY8Zga2tLgQIFqFevHpcvX9ZfK1iw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\n",
      "text/plain": [
       "<Figure size 648x648 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig = plt.figure(figsize=(9, 9))\n",
    "pos = nx.spring_layout(lemma_graph)\n",
    "\n",
    "nx.draw(lemma_graph, pos=pos, with_labels=False, font_weight=\"bold\")\n",
    "nx.draw_networkx_labels(lemma_graph, pos, labels);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now to run the algorithm, we use `PageRank` – a form of\n",
    "[*eigenvector centrality*](https://derwen.ai/docs/ptr/glossary/#eigenvector-centrality)\n",
    "– to calculate ranks for each of the nodes in the lemma graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: 0.025190055141357165,\n",
       " 1: 0.09709174565608479,\n",
       " 2: 0.03658656272138432,\n",
       " 3: 0.022947339381092696,\n",
       " 4: 0.07548767636963792,\n",
       " 5: 0.01884004785394172,\n",
       " 6: 0.01884004785394172,\n",
       " 7: 0.019767433918161055,\n",
       " 8: 0.03093250736456608,\n",
       " 9: 0.031636552282656216,\n",
       " 10: 0.0250439175297852,\n",
       " 11: 0.03969617593153302,\n",
       " 12: 0.02513276636673567,\n",
       " 13: 0.0390375393827704,\n",
       " 14: 0.02428614673389346,\n",
       " 15: 0.02428614673389346,\n",
       " 16: 0.031629446298645975,\n",
       " 17: 0.06334806476862227,\n",
       " 18: 0.061826419749828485,\n",
       " 19: 0.03201021345587308,\n",
       " 20: 0.02404712231242087,\n",
       " 21: 0.029468555366439973,\n",
       " 22: 0.04816979699201436,\n",
       " 23: 0.010894627731045426,\n",
       " 24: 0.026930354700088012,\n",
       " 25: 0.03165915652710971,\n",
       " 26: 0.029382686223731833,\n",
       " 27: 0.019263849959229938,\n",
       " 28: 0.01982332786706688,\n",
       " 29: 0.016743716826448173}"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ranks = nx.pagerank(lemma_graph)\n",
    "ranks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| node_id: 1, rank: 0.09709174565608479, labels[node_id]: 'system'\n",
      "ic| node_id: 4, rank: 0.07548767636963792, labels[node_id]: 'set'\n",
      "ic| node_id: 17, rank: 0.06334806476862227, labels[node_id]: 'minimal'\n",
      "ic| node_id: 18\n",
      "    rank: 0.061826419749828485\n",
      "    labels[node_id]: 'solution'\n",
      "ic| node_id: 22, rank: 0.04816979699201436, labels[node_id]: 'type'\n",
      "ic| node_id: 11\n",
      "    rank: 0.03969617593153302\n",
      "    labels[node_id]: 'inequation'\n",
      "ic| node_id: 13, rank: 0.0390375393827704, labels[node_id]: 'consider'\n",
      "ic| node_id: 2, rank: 0.03658656272138432, labels[node_id]: 'linear'\n",
      "ic| node_id: 19\n",
      "    rank: 0.03201021345587308\n",
      "    labels[node_id]: 'algorithm'\n",
      "ic| node_id: 25\n",
      "    rank: 0.03165915652710971\n",
      "    labels[node_id]: 'construct'\n",
      "ic| node_id: 9\n",
      "    rank: 0.031636552282656216\n",
      "    labels[node_id]: 'equation'\n",
      "ic| node_id: 16\n",
      "    rank: 0.031629446298645975\n",
      "    labels[node_id]: 'component'\n",
      "ic| node_id: 8\n",
      "    rank: 0.03093250736456608\n",
      "    labels[node_id]: 'diophantine'\n",
      "ic| node_id: 21\n",
      "    rank: 0.029468555366439973\n",
      "    labels[node_id]: 'generating'\n",
      "ic| node_id: 26\n",
      "    rank: 0.029382686223731833\n",
      "    labels[node_id]: 'support'\n",
      "ic| node_id: 24\n",
      "    rank: 0.026930354700088012\n",
      "    labels[node_id]: 'correspond'\n",
      "ic| node_id: 0\n",
      "    rank: 0.025190055141357165\n",
      "    labels[node_id]: 'compatibility'\n",
      "ic| node_id: 12\n",
      "    rank: 0.02513276636673567\n",
      "    labels[node_id]: 'nonstrict'\n",
      "ic| node_id: 10, rank: 0.0250439175297852, labels[node_id]: 'strict'\n",
      "ic| node_id: 14, rank: 0.02428614673389346, labels[node_id]: 'upper'\n",
      "ic| node_id: 15, rank: 0.02428614673389346, labels[node_id]: 'bound'\n",
      "ic| node_id: 20\n",
      "    rank: 0.02404712231242087\n",
      "    labels[node_id]: 'construction'\n",
      "ic| node_id: 3\n",
      "    rank: 0.022947339381092696\n",
      "    labels[node_id]: 'constraint'\n",
      "ic| node_id: 28, rank: 0.01982332786706688, labels[node_id]: 'solve'\n",
      "ic| node_id: 7\n",
      "    rank: 0.019767433918161055\n",
      "    labels[node_id]: 'criterion'\n",
      "ic| node_id: 27, rank: 0.019263849959229938, labels[node_id]: 'use'\n",
      "ic| node_id: 5, rank: 0.01884004785394172, labels[node_id]: 'natural'\n",
      "ic| node_id: 6, rank: 0.01884004785394172, labels[node_id]: 'number'\n",
      "ic| node_id: 29, rank: 0.016743716826448173, labels[node_id]: 'mixed'\n",
      "ic| node_id: 23, rank: 0.010894627731045426, labels[node_id]: 'give'\n"
     ]
    }
   ],
   "source": [
    "for node_id, rank in sorted(ranks.items(), key=lambda x: x[1], reverse=True):\n",
    "    ic(node_id, rank, labels[node_id])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define a function to collect the top-ranked phrases from the lemma graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
    "def collect_phrases (chunk, phrases, counts):\n",
    "    chunk_len = chunk.end - chunk.start\n",
    "    sq_sum_rank = 0.0\n",
    "    non_lemma = 0\n",
    "    compound_key = set([])\n",
    "\n",
    "    for i in range(chunk.start, chunk.end):\n",
    "        token = doc[i]\n",
    "        key = (token.lemma_, token.pos_)\n",
    "        \n",
    "        if key in seen_lemma:\n",
    "            node_id = list(seen_lemma.keys()).index(key)\n",
    "            rank = ranks[node_id]\n",
    "            sq_sum_rank += rank\n",
    "            compound_key.add(key)\n",
    "        \n",
    "            ic(token.lemma_, token.pos_, node_id, rank)\n",
    "        else:\n",
    "            non_lemma += 1\n",
    "    \n",
    "    # although the noun chunking is greedy, we discount the ranks using a\n",
    "    # point estimate based on the number of non-lemma tokens within a phrase\n",
    "    non_lemma_discount = chunk_len / (chunk_len + (2.0 * non_lemma) + 1.0)\n",
    "\n",
    "    # use root mean square (RMS) to normalize the contributions of all the tokens\n",
    "    phrase_rank = math.sqrt(sq_sum_rank / (chunk_len + non_lemma))\n",
    "    phrase_rank *= non_lemma_discount\n",
    "\n",
    "    # remove spurious punctuation\n",
    "    phrase = chunk.text.lower().replace(\"'\", \"\")\n",
    "\n",
    "    # create a unique key for the the phrase based on its lemma components\n",
    "    compound_key = tuple(sorted(list(compound_key)))\n",
    "    \n",
    "    if not compound_key in phrases:\n",
    "        phrases[compound_key] = set([ (phrase, phrase_rank) ])\n",
    "        counts[compound_key] = 1\n",
    "    else:\n",
    "        phrases[compound_key].add( (phrase, phrase_rank) )\n",
    "        counts[compound_key] += 1\n",
    "\n",
    "    ic(phrase_rank, chunk.text, chunk.start, chunk.end, chunk_len, counts[compound_key])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Collect the top-ranked phrases based on both the noun chunks and the named entities..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| token.lemma_: 'compatibility'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 0\n",
      "    rank: 0.025190055141357165\n",
      "ic| phrase_rank: 0.07935687610622845\n",
      "    chunk.text: 'Compatibility'\n",
      "    chunk.start: 0\n",
      "    chunk.end: 1\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'system'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 1\n",
      "    rank: 0.09709174565608479\n",
      "ic| phrase_rank: 0.15579774200552843\n",
      "    chunk.text: 'systems'\n",
      "    chunk.start: 2\n",
      "    chunk.end: 3\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'linear'\n",
      "    token.pos_: 'ADJ'\n",
      "    node_id: 2\n",
      "    rank: 0.03658656272138432\n",
      "ic| token.lemma_: 'constraint'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 3\n",
      "    rank: 0.022947339381092696\n",
      "ic| phrase_rank: 0.11502067650110856\n",
      "    chunk.text: 'linear constraints'\n",
      "    chunk.start: 4\n",
      "    chunk.end: 6\n",
      "    chunk_len: 2\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'set'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 4\n",
      "    rank: 0.07548767636963792\n",
      "ic| phrase_rank: 0.06345084244027568\n",
      "    chunk.text: 'the set'\n",
      "    chunk.start: 7\n",
      "    chunk.end: 9\n",
      "    chunk_len: 2\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'natural'\n",
      "    token.pos_: 'ADJ'\n",
      "    node_id: 5\n",
      "    rank: 0.01884004785394172\n",
      "ic| token.lemma_: 'number'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 6\n",
      "    rank: 0.01884004785394172\n",
      "ic| phrase_rank: 0.09150603587606598\n",
      "    chunk.text: 'natural numbers'\n",
      "    chunk.start: 10\n",
      "    chunk.end: 12\n",
      "    chunk_len: 2\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'criterion'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 7\n",
      "    rank: 0.019767433918161055\n",
      "ic| phrase_rank: 0.07029835332026109\n",
      "    chunk.text: 'Criteria'\n",
      "    chunk.start: 13\n",
      "    chunk.end: 14\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'compatibility'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 0\n",
      "    rank: 0.025190055141357165\n",
      "ic| phrase_rank: 0.07935687610622845\n",
      "    chunk.text: 'compatibility'\n",
      "    chunk.start: 15\n",
      "    chunk.end: 16\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 2\n",
      "ic| token.lemma_: 'system'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 1\n",
      "    rank: 0.09709174565608479\n",
      "ic| phrase_rank: 0.07195989462882217\n",
      "    chunk.text: 'a system'\n",
      "    chunk.start: 17\n",
      "    chunk.end: 19\n",
      "    chunk_len: 2\n",
      "    counts[compound_key]: 2\n",
      "ic| token.lemma_: 'linear'\n",
      "    token.pos_: 'ADJ'\n",
      "    node_id: 2\n",
      "    rank: 0.03658656272138432\n",
      "ic| token.lemma_: 'Diophantine'\n",
      "    token.pos_: 'PROPN'\n",
      "    node_id: 8\n",
      "    rank: 0.03093250736456608\n",
      "ic| token.lemma_: 'equation'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 9\n",
      "    rank: 0.031636552282656216\n",
      "ic| phrase_rank: 0.13635130800294415\n",
      "    chunk.text: 'linear Diophantine equations'\n",
      "    chunk.start: 20\n",
      "    chunk.end: 23\n",
      "    chunk_len: 3\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'strict'\n",
      "    token.pos_: 'ADJ'\n",
      "    node_id: 10\n",
      "    rank: 0.0250439175297852\n",
      "ic| token.lemma_: 'inequation'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 11\n",
      "    rank: 0.03969617593153302\n",
      "ic| phrase_rank: 0.11994451815672316\n",
      "    chunk.text: 'strict inequations'\n",
      "    chunk.start: 24\n",
      "    chunk.end: 26\n",
      "    chunk_len: 2\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'nonstrict'\n",
      "    token.pos_: 'ADJ'\n",
      "    node_id: 12\n",
      "    rank: 0.02513276636673567\n",
      "ic| token.lemma_: 'inequation'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 11\n",
      "    rank: 0.03969617593153302\n",
      "ic| phrase_rank: 0.12002679543267614\n",
      "    chunk.text: 'nonstrict inequations'\n",
      "    chunk.start: 28\n",
      "    chunk.end: 30\n",
      "    chunk_len: 2\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'Upper'\n",
      "    token.pos_: 'PROPN'\n",
      "    node_id: 14\n",
      "    rank: 0.02428614673389346\n",
      "ic| token.lemma_: 'bound'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 15\n",
      "    rank: 0.02428614673389346\n",
      "ic| phrase_rank: 0.10389342131646997\n",
      "    chunk.text: 'Upper bounds'\n",
      "    chunk.start: 33\n",
      "    chunk.end: 35\n",
      "    chunk_len: 2\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'component'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 16\n",
      "    rank: 0.031629446298645975\n",
      "ic| phrase_rank: 0.08892334662315343\n",
      "    chunk.text: 'components'\n",
      "    chunk.start: 36\n",
      "    chunk.end: 37\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'minimal'\n",
      "    token.pos_: 'ADJ'\n",
      "    node_id: 17\n",
      "    rank: 0.06334806476862227\n",
      "ic| token.lemma_: 'set'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 4\n",
      "    rank: 0.07548767636963792\n",
      "ic| phrase_rank: 0.09315167105930662\n",
      "    chunk.text: 'a minimal set'\n",
      "    chunk.start: 38\n",
      "    chunk.end: 41\n",
      "    chunk_len: 3\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'solution'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 18\n",
      "    rank: 0.061826419749828485\n",
      "ic| phrase_rank: 0.12432459506251015\n",
      "    chunk.text: 'solutions'\n",
      "    chunk.start: 42\n",
      "    chunk.end: 43\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'algorithm'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 19\n",
      "    rank: 0.03201021345587308\n",
      "ic| phrase_rank: 0.08945699169974514\n",
      "    chunk.text: 'algorithms'\n",
      "    chunk.start: 44\n",
      "    chunk.end: 45\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'construction'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 20\n",
      "    rank: 0.02404712231242087\n",
      "ic| phrase_rank: 0.07753567293901058\n",
      "    chunk.text: 'construction'\n",
      "    chunk.start: 46\n",
      "    chunk.end: 47\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'minimal'\n",
      "    token.pos_: 'ADJ'\n",
      "    node_id: 17\n",
      "    rank: 0.06334806476862227\n",
      "ic| token.lemma_: 'generating'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 21\n",
      "    rank: 0.029468555366439973\n",
      "ic| token.lemma_: 'set'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 4\n",
      "    rank: 0.07548767636963792\n",
      "ic| phrase_rank: 0.17764305670256655\n",
      "    chunk.text: 'minimal generating sets'\n",
      "    chunk.start: 48\n",
      "    chunk.end: 51\n",
      "    chunk_len: 3\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'solution'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 18\n",
      "    rank: 0.061826419749828485\n",
      "ic| phrase_rank: 0.12432459506251015\n",
      "    chunk.text: 'solutions'\n",
      "    chunk.start: 52\n",
      "    chunk.end: 53\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 2\n",
      "ic| token.lemma_: 'type'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 22\n",
      "    rank: 0.04816979699201436\n",
      "ic| phrase_rank: 0.050685854432712285\n",
      "    chunk.text: 'all types'\n",
      "    chunk.start: 54\n",
      "    chunk.end: 56\n",
      "    chunk_len: 2\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'system'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 1\n",
      "    rank: 0.09709174565608479\n",
      "ic| phrase_rank: 0.15579774200552843\n",
      "    chunk.text: 'systems'\n",
      "    chunk.start: 57\n",
      "    chunk.end: 58\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 3\n",
      "ic| token.lemma_: 'criterion'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 7\n",
      "    rank: 0.019767433918161055\n",
      "ic| phrase_rank: 0.03246941857043213\n",
      "    chunk.text: 'These criteria'\n",
      "    chunk.start: 61\n",
      "    chunk.end: 63\n",
      "    chunk_len: 2\n",
      "    counts[compound_key]: 2\n",
      "ic| token.lemma_: 'correspond'\n",
      "    token.pos_: 'VERB'\n",
      "    node_id: 24\n",
      "    rank: 0.026930354700088012\n",
      "ic| token.lemma_: 'algorithm'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 19\n",
      "    rank: 0.03201021345587308\n",
      "ic| phrase_rank: 0.0606941966727262\n",
      "    chunk.text: 'the corresponding algorithms'\n",
      "    chunk.start: 64\n",
      "    chunk.end: 67\n",
      "    chunk_len: 3\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'minimal'\n",
      "    token.pos_: 'ADJ'\n",
      "    node_id: 17\n",
      "    rank: 0.06334806476862227\n",
      "ic| token.lemma_: 'support'\n",
      "    token.pos_: 'VERB'\n",
      "    node_id: 26\n",
      "    rank: 0.029382686223731833\n",
      "ic| token.lemma_: 'set'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 4\n",
      "    rank: 0.07548767636963792\n",
      "ic| phrase_rank: 0.10481265770639074\n",
      "    chunk.text: 'a minimal supporting set'\n",
      "    chunk.start: 69\n",
      "    chunk.end: 73\n",
      "    chunk_len: 4\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'solution'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 18\n",
      "    rank: 0.061826419749828485\n",
      "ic| phrase_rank: 0.12432459506251015\n",
      "    chunk.text: 'solutions'\n",
      "    chunk.start: 74\n",
      "    chunk.end: 75\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 3\n",
      "ic| token.lemma_: 'consider'\n",
      "    token.pos_: 'VERB'\n",
      "    node_id: 13\n",
      "    rank: 0.0390375393827704\n",
      "ic| token.lemma_: 'type'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 22\n",
      "    rank: 0.04816979699201436\n",
      "ic| token.lemma_: 'system'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 1\n",
      "    rank: 0.09709174565608479\n",
      "ic| phrase_rank: 0.0811302044403381\n",
      "    chunk.text: 'all the considered types systems'\n",
      "    chunk.start: 80\n",
      "    chunk.end: 85\n",
      "    chunk_len: 5\n",
      "    counts[compound_key]: 1\n",
      "ic| token.lemma_: 'system'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 1\n",
      "    rank: 0.09709174565608479\n",
      "ic| phrase_rank: 0.15579774200552843\n",
      "    chunk.text: 'systems'\n",
      "    chunk.start: 86\n",
      "    chunk.end: 87\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 4\n",
      "ic| token.lemma_: 'mixed'\n",
      "    token.pos_: 'ADJ'\n",
      "    node_id: 29\n",
      "    rank: 0.016743716826448173\n",
      "ic| token.lemma_: 'type'\n",
      "    token.pos_: 'NOUN'\n",
      "    node_id: 22\n",
      "    rank: 0.04816979699201436\n",
      "ic| phrase_rank: 0.12010505939797736\n",
      "    chunk.text: 'mixed types'\n",
      "    chunk.start: 88\n",
      "    chunk.end: 90\n",
      "    chunk_len: 2\n",
      "    counts[compound_key]: 1\n"
     ]
    }
   ],
   "source": [
    "phrases = {}\n",
    "counts = {}\n",
    "\n",
    "for chunk in doc.noun_chunks:\n",
    "    collect_phrases(chunk, phrases, counts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| token.lemma_: 'Diophantine'\n",
      "    token.pos_: 'PROPN'\n",
      "    node_id: 8\n",
      "    rank: 0.03093250736456608\n",
      "ic| phrase_rank: 0.08793819898736567\n",
      "    chunk.text: 'Diophantine'\n",
      "    chunk.start: 21\n",
      "    chunk.end: 22\n",
      "    chunk_len: 1\n",
      "    counts[compound_key]: 1\n"
     ]
    }
   ],
   "source": [
    "for ent in doc.ents:\n",
    "    collect_phrases(ent, phrases, counts)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since noun chunks can be expressed in different ways (e.g., they may have articles or prepositions), we need to find a minimum span for each phrase based on combinations of lemmas..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "import operator\n",
    "\n",
    "min_phrases = {}\n",
    "\n",
    "for compound_key, rank_tuples in phrases.items():\n",
    "    l = list(rank_tuples)\n",
    "    l.sort(key=operator.itemgetter(1), reverse=True)\n",
    "    \n",
    "    phrase, rank = l[0]\n",
    "    count = counts[compound_key]\n",
    "    \n",
    "    min_phrases[phrase] = (rank, count)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then let's examine the results of TextRank..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase: 'minimal generating sets'\n",
      "    count: 1\n",
      "    rank: 0.17764305670256655\n",
      "ic| phrase: 'systems', count: 4, rank: 0.15579774200552843\n",
      "ic| phrase: 'linear diophantine equations'\n",
      "    count: 1\n",
      "    rank: 0.13635130800294415\n",
      "ic| phrase: 'solutions', count: 3, rank: 0.12432459506251015\n",
      "ic| phrase: 'mixed types', count: 1, rank: 0.12010505939797736\n",
      "ic| phrase: 'nonstrict inequations'\n",
      "    count: 1\n",
      "    rank: 0.12002679543267614\n",
      "ic| phrase: 'strict inequations', count: 1, rank: 0.11994451815672316\n",
      "ic| phrase: 'linear constraints', count: 1, rank: 0.11502067650110856\n",
      "ic| phrase: 'a minimal supporting set'\n",
      "    count: 1\n",
      "    rank: 0.10481265770639074\n",
      "ic| phrase: 'upper bounds', count: 1, rank: 0.10389342131646997\n",
      "ic| phrase: 'a minimal set', count: 1, rank: 0.09315167105930662\n",
      "ic| phrase: 'natural numbers', count: 1, rank: 0.09150603587606598\n",
      "ic| phrase: 'algorithms', count: 1, rank: 0.08945699169974514\n",
      "ic| phrase: 'components', count: 1, rank: 0.08892334662315343\n",
      "ic| phrase: 'diophantine', count: 1, rank: 0.08793819898736567\n",
      "ic| phrase: 'all the considered types systems'\n",
      "    count: 1\n",
      "    rank: 0.0811302044403381\n",
      "ic| phrase: 'compatibility', count: 2, rank: 0.07935687610622845\n",
      "ic| phrase: 'construction', count: 1, rank: 0.07753567293901058\n",
      "ic| phrase: 'criteria', count: 2, rank: 0.07029835332026109\n",
      "ic| phrase: 'the set', count: 1, rank: 0.06345084244027568\n",
      "ic| phrase: 'the corresponding algorithms'\n",
      "    count: 1\n",
      "    rank: 0.0606941966727262\n",
      "ic| phrase: 'all types', count: 1, rank: 0.050685854432712285\n"
     ]
    }
   ],
   "source": [
    "for phrase, (rank, count) in sorted(min_phrases.items(), key=lambda x: x[1][0], reverse=True):\n",
    "    ic(phrase, count, rank)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Just for kicks, compare with raw results of the non-chunked lemma nodes..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| labels[node_id]: 'system', rank: 0.09709174565608479\n",
      "ic| labels[node_id]: 'set', rank: 0.07548767636963792\n",
      "ic| labels[node_id]: 'minimal', rank: 0.06334806476862227\n",
      "ic| labels[node_id]: 'solution', rank: 0.061826419749828485\n",
      "ic| labels[node_id]: 'type', rank: 0.04816979699201436\n",
      "ic| labels[node_id]: 'inequation', rank: 0.03969617593153302\n",
      "ic| labels[node_id]: 'consider', rank: 0.0390375393827704\n",
      "ic| labels[node_id]: 'linear', rank: 0.03658656272138432\n",
      "ic| labels[node_id]: 'algorithm', rank: 0.03201021345587308\n",
      "ic| labels[node_id]: 'construct', rank: 0.03165915652710971\n",
      "ic| labels[node_id]: 'equation', rank: 0.031636552282656216\n",
      "ic| labels[node_id]: 'component', rank: 0.031629446298645975\n",
      "ic| labels[node_id]: 'diophantine', rank: 0.03093250736456608\n",
      "ic| labels[node_id]: 'generating', rank: 0.029468555366439973\n",
      "ic| labels[node_id]: 'support', rank: 0.029382686223731833\n",
      "ic| labels[node_id]: 'correspond', rank: 0.026930354700088012\n",
      "ic| labels[node_id]: 'compatibility', rank: 0.025190055141357165\n",
      "ic| labels[node_id]: 'nonstrict', rank: 0.02513276636673567\n",
      "ic| labels[node_id]: 'strict', rank: 0.0250439175297852\n",
      "ic| labels[node_id]: 'upper', rank: 0.02428614673389346\n",
      "ic| labels[node_id]: 'bound', rank: 0.02428614673389346\n",
      "ic| labels[node_id]: 'construction', rank: 0.02404712231242087\n",
      "ic| labels[node_id]: 'constraint', rank: 0.022947339381092696\n",
      "ic| labels[node_id]: 'solve', rank: 0.01982332786706688\n",
      "ic| labels[node_id]: 'criterion', rank: 0.019767433918161055\n",
      "ic| labels[node_id]: 'use', rank: 0.019263849959229938\n",
      "ic| labels[node_id]: 'natural', rank: 0.01884004785394172\n",
      "ic| labels[node_id]: 'number', rank: 0.01884004785394172\n",
      "ic| labels[node_id]: 'mixed', rank: 0.016743716826448173\n",
      "ic| labels[node_id]: 'give', rank: 0.010894627731045426\n"
     ]
    }
   ],
   "source": [
    "for node_id, rank in sorted(ranks.items(), key=lambda x: x[1], reverse=True):\n",
    "    ic(labels[node_id], rank)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
